package com.lyy.component;

import cn.hutool.core.util.ObjectUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * @author Liangyaoyun
 */
@Component
@Aspect
@Slf4j
public class ServiceAspect {
    @SneakyThrows
    @Around("execution(public * com.lyy.service.impl..*.*(..))")
    public Object aroundAdvice(ProceedingJoinPoint pjp) {

        // 获取方法参数
        Object[] args = pjp.getArgs();

        // 前置通知: 检查参数中是否存在空值
        if (ObjectUtil.hasNull(args)) {
            throw new RuntimeException("业务方法参数不能为空");
        }

        // 调用目标方法
        Object returnValue = pjp.proceed(args);

        // 后置通知: 记录日志
        log.info("调用了 {} 类中的 {} 方法", pjp.getTarget(), pjp.getSignature().getName());

        // 返回目标方法的返回值
        return returnValue;
    }

}
